/**
 * 
 */
package platzerworld.kegeln.db.wettkampf;

import java.util.ArrayList;
import java.util.List;

import platzerworld.kegeln.common.db.Sortierung;
import platzerworld.kegeln.common.logging.LOG;
import platzerworld.kegeln.db.KegelverwaltungDatenbank;
import platzerworld.kegeln.vo.wettkampf.WettkampfVO;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.util.Log;

/**
 * Der WettkampfSpeicher ist die Schnittstelle zu persistenten Wettkampfdaten. * 
 * Die Wettkampfdaten sind in der Anwendungsdatenbank abgelegt. Die Anwendung sollte nur �ber den WettkampfSpeicher auf gespeicherte Daten zugreifen.
 * Um den WettkampfSpeicher erzeugen zu k�nnen, muss die aufrufende Android-Komponente ihren Context �bergeben.
 * 
 * @author platzerg
 */
public class WettkampfSpeicher {

	/** Markierung f�r Logging. */
	private static final String TAG = "WettkampfSpeicher";

	/** Verweis auf die Kegelverwaltung-Datenbank. */
	private KegelverwaltungDatenbank mDb;

	/**
	 * Default-Construktor.
	 */
	public WettkampfSpeicher() {
	}
	
	/**
	 * Erzeugt einen neuen WettkampfSpeicher. 
	 * Dabei wird sichergestellt, dass die zugrundeliegende Datenbank unmittelbar nutzbar ist.
	 * 
	 * @param context Kontext der Anwendung, f�r die der Speicher g�ltig sein soll.
	 */
	public WettkampfSpeicher(Context context) {
		mDb = new KegelverwaltungDatenbank(context);
		LOG.v(TAG, "WettkampfSpeicher angelegt.");
	}
	
	/**
	 * Speicherung eines Wettkampfes.
	 * 
	 * @param wettkampfVO enth�lt die Daten des Wettkampfes
	 * @param isUpdate true dann update sonst insert
	 * 
	 * @return key Wettkampfes
	 */
	public long speichereWettkampf(WettkampfVO wettkampfVO, boolean isUpdate) {
		if (!isUpdate) {
			return speichereWettkampfAllColumns(wettkampfVO);
		} else {
			aendereWettkampf(wettkampfVO);
			return wettkampfVO.key;
		}
	}

	/**
	 * Legt einen neuen Wettkampf in der Datenbank an.
	 * 
	 * @param wettkampfVO enth�lt die Daten des Wettkampfes
	 * 
	 * @return key Wettkampfes
	 */
	public long speichereWettkampfAllColumns(WettkampfVO wettkampfVO) {
		final ContentValues daten = new ContentValues();
		daten.put(WettkampfTbl.SPIEL_NR, wettkampfVO.spielNr);
		daten.put(WettkampfTbl.HEIM_ID, wettkampfVO.heimId);
		daten.put(WettkampfTbl.GAST_ID, wettkampfVO.gastId);
		daten.put(WettkampfTbl.KLASSE_ID, wettkampfVO.klasseId);
		daten.put(WettkampfTbl.SPIEL_ZEIT, wettkampfVO.spielZeit);

		daten.put(WettkampfTbl.PAARUNG_1, wettkampfVO.paarung1);
		daten.put(WettkampfTbl.PAARUNG_1_ERGEBNIS_HEIM, wettkampfVO.paarung1ErgebnisHeim);
		daten.put(WettkampfTbl.PAARUNG_1_ERGEBNIS_GAST, wettkampfVO.paarung1ErgebnisGast);
		
		daten.put(WettkampfTbl.PAARUNG_2, wettkampfVO.paarung2);
		daten.put(WettkampfTbl.PAARUNG_2_ERGEBNIS_HEIM, wettkampfVO.paarung2ErgebnisHeim);
		daten.put(WettkampfTbl.PAARUNG_2_ERGEBNIS_GAST, wettkampfVO.paarung2ErgebnisGast);
		
		daten.put(WettkampfTbl.PAARUNG_3, wettkampfVO.paarung3);
		daten.put(WettkampfTbl.PAARUNG_3_ERGEBNIS_HEIM, wettkampfVO.paarung3ErgebnisHeim);
		daten.put(WettkampfTbl.PAARUNG_3_ERGEBNIS_GAST, wettkampfVO.paarung3ErgebnisGast);
		
		daten.put(WettkampfTbl.PAARUNG_4, wettkampfVO.paarung4);
		daten.put(WettkampfTbl.PAARUNG_4_ERGEBNIS_HEIM, wettkampfVO.paarung4ErgebnisHeim);
		daten.put(WettkampfTbl.PAARUNG_4_ERGEBNIS_GAST, wettkampfVO.paarung4ErgebnisGast);
		
		daten.put(WettkampfTbl.PAARUNG_5, wettkampfVO.paarung5);
		daten.put(WettkampfTbl.PAARUNG_5_ERGEBNIS_HEIM, wettkampfVO.paarung5ErgebnisHeim);
		daten.put(WettkampfTbl.PAARUNG_5_ERGEBNIS_GAST, wettkampfVO.paarung5ErgebnisGast);
		
		daten.put(WettkampfTbl.PAARUNG_6, wettkampfVO.paarung6);
		daten.put(WettkampfTbl.PAARUNG_6_ERGEBNIS_HEIM, wettkampfVO.paarung6ErgebnisHeim);
		daten.put(WettkampfTbl.PAARUNG_6_ERGEBNIS_GAST, wettkampfVO.paarung6ErgebnisGast);
		
		daten.put(WettkampfTbl.GESAMT_ERGEBNIS, wettkampfVO.gesamtErgebnis);
		
		final SQLiteDatabase dbCon = mDb.getWritableDatabase();

		try {
			final long id = dbCon.insertOrThrow(WettkampfTbl.TABLE_NAME, null, daten);
			Log.i(TAG, "Wettkampf mit id=" + id + " erzeugt.");
			return id;
		} finally {
			dbCon.close();
		}
	}

	/**
	 * �ndert einen vorhandenen Wettkampf in der Datenbank. 
	 * Wenn die id nicht mitgegeben wird, wird keine �nderung durchgef�hrt. 
	 * Es werden bei der �nderung alle Parameter ber�cksichtigt.
	 * 
	 * @param wettkampfVO enth�lt die Daten des Wettkampfes
	 */
	public void aendereWettkampf(WettkampfVO wettkampfVO) {
		if (wettkampfVO.key == 0) {
			Log.w(TAG, "id == 0 => kein update m�glich.");
			return;
		}

		final ContentValues daten = new ContentValues();
		daten.put(WettkampfTbl.SPIEL_NR, wettkampfVO.spielNr);
		daten.put(WettkampfTbl.HEIM_ID, wettkampfVO.heimId);
		daten.put(WettkampfTbl.GAST_ID, wettkampfVO.gastId);
		daten.put(WettkampfTbl.KLASSE_ID, wettkampfVO.klasseId);
		daten.put(WettkampfTbl.SPIEL_ZEIT, wettkampfVO.spielZeit);

		daten.put(WettkampfTbl.PAARUNG_1, wettkampfVO.paarung1);
		daten.put(WettkampfTbl.PAARUNG_1_ERGEBNIS_HEIM, wettkampfVO.paarung1ErgebnisHeim);
		daten.put(WettkampfTbl.PAARUNG_1_ERGEBNIS_GAST, wettkampfVO.paarung1ErgebnisGast);
		
		daten.put(WettkampfTbl.PAARUNG_2, wettkampfVO.paarung2);
		daten.put(WettkampfTbl.PAARUNG_2_ERGEBNIS_HEIM, wettkampfVO.paarung2ErgebnisHeim);
		daten.put(WettkampfTbl.PAARUNG_2_ERGEBNIS_GAST, wettkampfVO.paarung2ErgebnisGast);
		
		daten.put(WettkampfTbl.PAARUNG_3, wettkampfVO.paarung3);
		daten.put(WettkampfTbl.PAARUNG_3_ERGEBNIS_HEIM, wettkampfVO.paarung3ErgebnisHeim);
		daten.put(WettkampfTbl.PAARUNG_3_ERGEBNIS_GAST, wettkampfVO.paarung3ErgebnisGast);
		
		daten.put(WettkampfTbl.PAARUNG_4, wettkampfVO.paarung4);
		daten.put(WettkampfTbl.PAARUNG_4_ERGEBNIS_HEIM, wettkampfVO.paarung4ErgebnisHeim);
		daten.put(WettkampfTbl.PAARUNG_4_ERGEBNIS_GAST, wettkampfVO.paarung4ErgebnisGast);
		
		daten.put(WettkampfTbl.PAARUNG_5, wettkampfVO.paarung5);
		daten.put(WettkampfTbl.PAARUNG_5_ERGEBNIS_HEIM, wettkampfVO.paarung5ErgebnisHeim);
		daten.put(WettkampfTbl.PAARUNG_5_ERGEBNIS_GAST, wettkampfVO.paarung5ErgebnisGast);
		
		daten.put(WettkampfTbl.PAARUNG_6, wettkampfVO.paarung6);
		daten.put(WettkampfTbl.PAARUNG_6_ERGEBNIS_HEIM, wettkampfVO.paarung6ErgebnisHeim);
		daten.put(WettkampfTbl.PAARUNG_6_ERGEBNIS_GAST, wettkampfVO.paarung6ErgebnisGast);
		
		daten.put(WettkampfTbl.GESAMT_ERGEBNIS, wettkampfVO.gesamtErgebnis);

		final SQLiteDatabase dbCon = mDb.getWritableDatabase();

		try {
			dbCon.update(WettkampfTbl.TABLE_NAME, daten, WettkampfTbl.WHERE_ID_EQUALS,
					new String[] { String.valueOf(wettkampfVO.key) });
			Log.i(TAG, "Wettkampf mit id=" + wettkampfVO.key + " aktualisiert.");
		} finally {
			dbCon.close();
		}
	}

	/**
	 * Entfernt einen Wettkampf aus der Datenbank.
	 * 
	 * @param id Schl�ssel des gesuchten Wettkampfes
	 * 
	 * @return true, wenn Datensatz geloescht wurde.
	 */
	public boolean loescheWettkampf(long id) {
		final SQLiteDatabase dbCon = mDb.getWritableDatabase();

		int anzahlLoeschungen = 0;
		try {
			anzahlLoeschungen = dbCon.delete(WettkampfTbl.TABLE_NAME, WettkampfTbl.WHERE_ID_EQUALS,
					new String[] { String.valueOf(id) });
			Log.i(TAG, "Wettkampf mit id=" + id + " gel�scht.");
		} finally {
			dbCon.close();
		}
		return anzahlLoeschungen == 1;
	}
	
	/**
	 * Entfernt einen Wettkampf zur spielNr aus der Datenbank.
	 * 
	 * @param spielNr die Spielnummer des gesuchten Wettkampfes
	 * @return true, wenn Datensatz geloescht wurde.
	 */
	public boolean loescheWettkampfBySpielNr(long spielNr) {
		final SQLiteDatabase dbCon = mDb.getWritableDatabase();

		int anzahlLoeschungen = 0;
		try {
			anzahlLoeschungen = dbCon.delete(WettkampfTbl.TABLE_NAME, WettkampfTbl.WHERE_SPIEL_NR_EQUALS,
					new String[] { String.valueOf(spielNr) });
			Log.i(TAG, "Wettkampf id=" + spielNr + " gel�scht.");
		} finally {
			dbCon.close();
		}
		return anzahlLoeschungen == 1;
	}

	/**
	 * Liefert einen Cursor zur id auf alle Felder der Wettkampf-Tabelle zur�ck. 
	 * Wenn ein kompletter Wettkampf genutzt werden soll, ist die ladeWettkampf-Methode vorzuziehen.
	 * 
	 * @param id Schl�ssel des gesuchten Wettkampfes
	 * 
	 * @return Cursor, oder null
	 */
	public Cursor ladeWettkampf(long id) {
		return mDb.getReadableDatabase().query(WettkampfTbl.TABLE_NAME, WettkampfTbl.ALL_COLUMNS,
				WettkampfTbl.WHERE_ID_EQUALS, new String[] { String.valueOf(id) }, null, null, null);
	}

	/**
	 * Liefert ein Value-Object WettkampfVO zur id mit allen Feldern der Wettkampf-Tabelle zur�ck.
	 * 
	 * @param id Sch�ssel des gesuchten Kontakts
	 * 
	 * @return WettkampfVO, oder null
	 */
	public WettkampfVO ladeWettkampfVO(long id) {
		WettkampfVO wettkampfVO = null;
		Cursor c = null;
		try {
			c = mDb.getReadableDatabase().query(WettkampfTbl.TABLE_NAME, WettkampfTbl.ALL_COLUMNS,
					WettkampfTbl.WHERE_ID_EQUALS, new String[] { String.valueOf(id) }, null, null, null);
			if (c.moveToFirst() == false) {
				return null;
			}
			wettkampfVO = ladeWettkampf(c);
		} finally {
			if (c != null) {
				c.close();
			}
		}
		return wettkampfVO;
	}
	
	/**
	 * Liefert ein Value-Object WettkampfVO zur Spielnummer mit allen Feldern der Mannschaft-Tabelle zur�ck.
	 * 
	 * @param spielNr die Spielnummer des Wettkampfes
	 * 
	 * @return MannschaftVO, oder null
	 */
	public WettkampfVO ladeWettkampfVOBySpielNr(long spielNr) {
		WettkampfVO wettkampfVO = null;
		Cursor c = null;
		try {
			c = mDb.getReadableDatabase().query(WettkampfTbl.TABLE_NAME, WettkampfTbl.ALL_COLUMNS,
					WettkampfTbl.WHERE_SPIEL_NR_EQUALS, new String[] { String.valueOf(spielNr) }, null, null, null);
			if (c.moveToFirst() == false) {
				return null;
			}
			wettkampfVO = ladeWettkampfBySpielNr(c);
		} finally {
			if (c != null) {
				c.close();
			}
		}
		return wettkampfVO;
	}

	/**
	 * Liefert einen Cursor zur Spielnummer auf alle Felder der Mannschaft-Tabelle zur�ck.
	 * 
	 * @param spielNr die Spielnummer des Wettkampfes
	 * 
	 * @return Cursor, oder null
	 */
	public Cursor ladeWettkampfDetails(long spielNr) {

		return mDb.getReadableDatabase().query(WettkampfTbl.TABLE_NAME, WettkampfTbl.ALL_COLUMNS, WettkampfTbl.WHERE_SPIEL_NR_EQUALS,
				new String[] { String.valueOf(spielNr) }, null, null, WettkampfTbl.ORDER_BY_SPIEL_NR);
	}
	

	/**
	 * Liefert alle WettkampfVO's sortiert nach Name zur�ck.
	 * 
	 * Es kann (optional) ein Filterkriterium angegeben werden. 
	 * Wenn dernamensFilterdefiniert ist, werden nur Kontakte geliefert, deren NAME mit diesem Buchstaben beginnt.
	 * 
	 * @param namensFilter Anfangsbuchstaben (case sensitive) des zu suchenden Wettkampfes.
	 * 
	 * @return Cursor auf die Ergebnisliste.
	 */
	public Cursor ladeWettkampfListe() {
		return ladeWettkampfListe(Sortierung.STANDARD);
	}

	/**
	 * L�dt die Klassen aus dem KlasseTbl-Datensatz, auf dem der Cursor gerade steht.
	 * Der Cursor wird anschlie�end deaktiviert, da er im KlasseSpeicher nur intern als "letzter Aufruf" aufgerufen wird.
	 * 
	 * @param c aktuelle Cursorposition
	 * 
	 * @return ArrayList<WettkampfVO> wettk�mpfe
	 */
	public ArrayList<WettkampfVO> ladeWettkampfKeyValueVO(Cursor c) {
		ArrayList<WettkampfVO> wettkaempfeVO = new ArrayList<WettkampfVO>();
		WettkampfVO wettkampfVO = null;
		if (c != null) {
			if (c.moveToFirst()) {
				do {
					wettkampfVO = new WettkampfVO();
					wettkampfVO.key = c.getLong(c.getColumnIndex(WettkampfTbl.ID));
					wettkampfVO.spielNr = c.getLong(c.getColumnIndex(WettkampfTbl.SPIEL_NR));
					wettkampfVO.heimId = c.getLong(c.getColumnIndex(WettkampfTbl.HEIM_ID));
					wettkampfVO.gastId = c.getLong(c.getColumnIndex(WettkampfTbl.GAST_ID));
					wettkampfVO.klasseId = c.getLong(c.getColumnIndex(WettkampfTbl.KLASSE_ID));
					wettkampfVO.spielZeit = c.getString(c.getColumnIndex(WettkampfTbl.SPIEL_ZEIT));
					
					wettkampfVO.paarung1 = c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_1));
					wettkampfVO.paarung1ErgebnisHeim = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_1_ERGEBNIS_HEIM));
					wettkampfVO.paarung1ErgebnisGast = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_1_ERGEBNIS_GAST));
					
					wettkampfVO.paarung2 = c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_2));
					wettkampfVO.paarung2ErgebnisHeim = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_2_ERGEBNIS_HEIM));
					wettkampfVO.paarung2ErgebnisGast = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_2_ERGEBNIS_GAST));
					
					wettkampfVO.paarung3 = c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_3));
					wettkampfVO.paarung3ErgebnisHeim = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_3_ERGEBNIS_HEIM));
					wettkampfVO.paarung3ErgebnisGast = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_3_ERGEBNIS_GAST));
					
					wettkampfVO.paarung4 = c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_4));
					wettkampfVO.paarung4ErgebnisHeim = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_4_ERGEBNIS_HEIM));
					wettkampfVO.paarung4ErgebnisGast = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_4_ERGEBNIS_GAST));
					
					wettkampfVO.paarung5 = c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_5));
					wettkampfVO.paarung5ErgebnisHeim = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_5_ERGEBNIS_HEIM));
					wettkampfVO.paarung5ErgebnisGast = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_5_ERGEBNIS_GAST));
					
					wettkampfVO.paarung6 = c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_6));
					wettkampfVO.paarung6ErgebnisHeim = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_6_ERGEBNIS_HEIM));
					wettkampfVO.paarung6ErgebnisGast = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_6_ERGEBNIS_GAST));
					
					wettkampfVO.gesamtErgebnis = c.getString(c.getColumnIndex(WettkampfTbl.GESAMT_ERGEBNIS));
					
					wettkaempfeVO.add(wettkampfVO);
				} while (c.moveToNext());
			}
		}

		return wettkaempfeVO;
	}

	/**
	 * Liefert alle Wettk�mpfe mit einstellbarer Sortierung zur�ck.
	 * Es kann (optional) ein Filterkriterium angegeben werden. Wenn der namensFilter definiert ist.
	 * 
	 * @param sortierung  Art der Sortierung
	 * @return Cursor auf die Ergebnisliste.
	 */
	public Cursor ladeWettkampfListe(Sortierung sortierung) {
		final SQLiteQueryBuilder wettkampfSuche = new SQLiteQueryBuilder();
		wettkampfSuche.setTables(WettkampfTbl.TABLE_NAME);
		
		String[] whereAttribs = null;

		return wettkampfSuche.query(mDb.getReadableDatabase(), WettkampfTbl.ALL_COLUMNS, null, whereAttribs, null, null,
				getWettkampfSortierung(sortierung));
	}


	/**
	 * L�dt die Klassen aus dem WettkampfTbl-Datensatz, auf dem der Cursor gerade steht.
	 * Der Cursor wird anschlie�end deaktiviert, da er im WettkampfSpeicher nur intern als "letzter Aufruf" aufgerufen wird.
	 * 
	 * @return List<String[]> wettk�mpfe als String-Array
	 */
	public List<String[]> ladeWettkampfAsStringArray() {
		Cursor c = null;
		List<String[]> wettkampfAsArray = new ArrayList<String[]>();
		try {
			c = ladeWettkampfListe();
			
			if (c != null ) {
	    		if  (c.moveToFirst()) {
	    			do {    	
	    				String[] wettkampfZeile = new String[25];
	    				
	    				// ID, SPIEL_NR, HEIM_ID, GAST_ID, KLASSE_ID, SPIEL_ZEIT, PAARUNG_1, PAARUNG_1_ERGEBNIS_HEIM, PAARUNG_1_ERGEBNIS_GAST, 
	    				// PAARUNG_2, PAARUNG_2_ERGEBNIS_HEIM, PAARUNG_2_ERGEBNIS_GAST, PAARUNG_3, PAARUNG_3_ERGEBNIS_HEIM, PAARUNG_3_ERGEBNIS_GAST, 
	    				// PAARUNG_4, PAARUNG_4_ERGEBNIS_HEIM, PAARUNG4_ERGEBNIS_GAST, PAARUNG_5, PAARUNG_5_ERGEBNIS_HEIM, PAARUNG_5_ERGEBNIS_GAST, 
	    				// PAARUNG_6, PAARUNG_6_ERGEBNIS_HEIM, PAARUNG_6_ERGEBNIS_GAST, GESAMT_ERGEBNIS
	    				wettkampfZeile[0] =  String.valueOf(c.getLong(c.getColumnIndex(WettkampfTbl.ID)));
	    				wettkampfZeile[1] =  String.valueOf(c.getLong(c.getColumnIndex(WettkampfTbl.SPIEL_NR)));
	    				wettkampfZeile[2] =  String.valueOf(c.getLong(c.getColumnIndex(WettkampfTbl.HEIM_ID)));
	    				wettkampfZeile[3] =  String.valueOf(c.getLong(c.getColumnIndex(WettkampfTbl.GAST_ID)));
	    				wettkampfZeile[4] =  String.valueOf(c.getLong(c.getColumnIndex(WettkampfTbl.KLASSE_ID)));
	    				wettkampfZeile[5] =  String.valueOf(c.getString(c.getColumnIndex(WettkampfTbl.SPIEL_ZEIT)));
	    				
	    				wettkampfZeile[6] =  String.valueOf(c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_1)));
	    				wettkampfZeile[7] =  String.valueOf(c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_1_ERGEBNIS_HEIM)));
	    				wettkampfZeile[8] =  String.valueOf(c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_1_ERGEBNIS_GAST)));
	    				
	    				wettkampfZeile[9] =  String.valueOf(c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_2)));
	    				wettkampfZeile[10] =  String.valueOf(c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_2_ERGEBNIS_HEIM)));
	    				wettkampfZeile[11] =  String.valueOf(c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_2_ERGEBNIS_GAST)));
	    				
	    				wettkampfZeile[12] =  String.valueOf(c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_3)));
	    				wettkampfZeile[13] =  String.valueOf(c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_3_ERGEBNIS_HEIM)));
	    				wettkampfZeile[14] =  String.valueOf(c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_3_ERGEBNIS_GAST)));
	    				
	    				wettkampfZeile[15] =  String.valueOf(c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_4)));
	    				wettkampfZeile[16] =  String.valueOf(c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_4_ERGEBNIS_HEIM)));
	    				wettkampfZeile[17] =  String.valueOf(c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_4_ERGEBNIS_GAST)));
	    				
	    				wettkampfZeile[18] =  String.valueOf(c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_5)));
	    				wettkampfZeile[19] =  String.valueOf(c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_5_ERGEBNIS_HEIM)));
	    				wettkampfZeile[20] =  String.valueOf(c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_5_ERGEBNIS_GAST)));
	    				
	    				wettkampfZeile[21] =  String.valueOf(c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_6)));
	    				wettkampfZeile[22] =  String.valueOf(c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_6_ERGEBNIS_HEIM)));
	    				wettkampfZeile[23] =  String.valueOf(c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_6_ERGEBNIS_GAST)));
	    				
	    				wettkampfZeile[24] =  String.valueOf(c.getString(c.getColumnIndex(WettkampfTbl.GESAMT_ERGEBNIS)));
	    				
	    				wettkampfAsArray.add(wettkampfZeile);
	    			}while (c.moveToNext());
	    		} 
	    	}
		} finally {
			if (c != null) {
				c.close();
			}
		}

		return wettkampfAsArray;
	}
	
	/**
	 * Liefert die Sortierung unter Ber�cksichtigung der Standard-Sortierung der Wettkampftabelle.
	 * 
	 * @param sortierung Sortierung als enum.
	 * 
	 * @return Sortierung als ORDER_BY kompatible Anweisung.
	 */
	private static String getWettkampfSortierung(Sortierung sortierung) {
		String sortiertNach = WettkampfTbl.DEFAULT_SORT_ORDER;
		switch (sortierung) {
		case GESAMT_ERGEBNIS:
			sortiertNach = WettkampfTbl.GESAMT_ERGEBNIS;
			break;
		case ID:
			sortiertNach = WettkampfTbl.ID;
			break;
		default:
			break;
		}
		return sortiertNach;
	}

	/**
	 * L�dt die Mannschaft aus dem WettkampfTbl-Datensatz, auf dem der Cursor gerade steht.
	 * Der Cursor wird anschlie�end deaktiviert, da er im WettkampfSpeicher nur intern als "letzter Aufruf" aufgerufen wird.
	 * 
	 * @param c aktuelle Cursorposition
	 * @return WettkampfVO
	 */
	public WettkampfVO ladeWettkampf(Cursor c) {
		final WettkampfVO wettkampfVO = new WettkampfVO();

		wettkampfVO.key = c.getLong(c.getColumnIndex(WettkampfTbl.ID));
		wettkampfVO.spielNr = c.getLong(c.getColumnIndex(WettkampfTbl.SPIEL_NR));
		wettkampfVO.heimId = c.getLong(c.getColumnIndex(WettkampfTbl.HEIM_ID));
		wettkampfVO.gastId = c.getLong(c.getColumnIndex(WettkampfTbl.GAST_ID));
		wettkampfVO.klasseId = c.getLong(c.getColumnIndex(WettkampfTbl.KLASSE_ID));
		wettkampfVO.spielZeit = c.getString(c.getColumnIndex(WettkampfTbl.SPIEL_ZEIT));
		
		wettkampfVO.paarung1 =  c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_1));
		wettkampfVO.paarung1ErgebnisHeim = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_1_ERGEBNIS_HEIM));
		wettkampfVO.paarung1ErgebnisGast = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_1_ERGEBNIS_GAST));
		
		wettkampfVO.paarung2 =  c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_2));
		wettkampfVO.paarung2ErgebnisHeim = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_2_ERGEBNIS_HEIM));
		wettkampfVO.paarung2ErgebnisGast = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_2_ERGEBNIS_GAST));
		
		wettkampfVO.paarung3 =  c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_3));
		wettkampfVO.paarung3ErgebnisHeim = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_3_ERGEBNIS_HEIM));
		wettkampfVO.paarung3ErgebnisGast = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_3_ERGEBNIS_GAST));
		
		wettkampfVO.paarung4 =  c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_4));
		wettkampfVO.paarung4ErgebnisHeim = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_4_ERGEBNIS_HEIM));
		wettkampfVO.paarung4ErgebnisGast = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_4_ERGEBNIS_GAST));
		
		wettkampfVO.paarung5 =  c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_5));
		wettkampfVO.paarung5ErgebnisHeim = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_5_ERGEBNIS_HEIM));
		wettkampfVO.paarung5ErgebnisGast = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_5_ERGEBNIS_GAST));
		
		wettkampfVO.paarung6 =  c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_6));
		wettkampfVO.paarung6ErgebnisHeim = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_6_ERGEBNIS_HEIM));
		wettkampfVO.paarung6ErgebnisGast = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_6_ERGEBNIS_GAST));
		
		wettkampfVO.gesamtErgebnis = c.getString(c.getColumnIndex(WettkampfTbl.GESAMT_ERGEBNIS));
		
		
		return wettkampfVO;
	}
	
	/**
	 * L�dt den Wettkampf aus dem WettkampfTbl-Datensatz, auf dem der Cursor gerade steht.
	 * Der Cursor wird anschlie�end deaktiviert, da er im WettkampfSpeicher nur intern als "letzter Aufruf" aufgerufen wird.
	 * 
	 * @param c aktuelle Cursorposition
	 * @return WettkampfVO
	 */
	public WettkampfVO ladeWettkampfBySpielNr(Cursor c) {
		final WettkampfVO wettkampfVO = new WettkampfVO();

		wettkampfVO.key = c.getLong(c.getColumnIndex(WettkampfTbl.ID));
		wettkampfVO.spielNr = c.getLong(c.getColumnIndex(WettkampfTbl.SPIEL_NR));
		wettkampfVO.heimId = c.getLong(c.getColumnIndex(WettkampfTbl.HEIM_ID));
		wettkampfVO.gastId = c.getLong(c.getColumnIndex(WettkampfTbl.GAST_ID));
		wettkampfVO.klasseId = c.getLong(c.getColumnIndex(WettkampfTbl.KLASSE_ID));
		wettkampfVO.spielZeit = c.getString(c.getColumnIndex(WettkampfTbl.SPIEL_ZEIT));
		
		wettkampfVO.paarung1 =  c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_1));
		wettkampfVO.paarung1ErgebnisHeim = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_1_ERGEBNIS_HEIM));
		wettkampfVO.paarung1ErgebnisGast = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_1_ERGEBNIS_GAST));
		
		wettkampfVO.paarung2 =  c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_2));
		wettkampfVO.paarung2ErgebnisHeim = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_2_ERGEBNIS_HEIM));
		wettkampfVO.paarung2ErgebnisGast = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_2_ERGEBNIS_GAST));
		
		wettkampfVO.paarung3 =  c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_3));
		wettkampfVO.paarung3ErgebnisHeim = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_3_ERGEBNIS_HEIM));
		wettkampfVO.paarung3ErgebnisGast = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_3_ERGEBNIS_GAST));
		
		wettkampfVO.paarung4 =  c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_4));
		wettkampfVO.paarung4ErgebnisHeim = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_4_ERGEBNIS_HEIM));
		wettkampfVO.paarung4ErgebnisGast = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_4_ERGEBNIS_GAST));
		
		wettkampfVO.paarung5 =  c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_5));
		wettkampfVO.paarung5ErgebnisHeim = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_5_ERGEBNIS_HEIM));
		wettkampfVO.paarung5ErgebnisGast = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_5_ERGEBNIS_GAST));
		
		wettkampfVO.paarung6 =  c.getString(c.getColumnIndex(WettkampfTbl.PAARUNG_6));
		wettkampfVO.paarung6ErgebnisHeim = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_6_ERGEBNIS_HEIM));
		wettkampfVO.paarung6ErgebnisGast = c.getLong(c.getColumnIndex(WettkampfTbl.PAARUNG_6_ERGEBNIS_GAST));
		
		wettkampfVO.gesamtErgebnis = c.getString(c.getColumnIndex(WettkampfTbl.GESAMT_ERGEBNIS));
		
		
		return wettkampfVO;
	}

	/**
	 * Schliesst die zugrundeliegende Datenbank. Vor dem naechsten Zugriff muss oeffnen() aufgerufen werden.
	 */
	public void schliessen() {
		mDb.close();
		LOG.v(TAG, "Datenbank kegelverwaltung geschlossen.");
	}

	/**
	 * Oeffnet die Datenbank, falls sie vorher mit schliessen() geschlossen wurde. 
	 * Bei Bedarf wird das Schema angelegt bzw. aktualisiert.
	 */
	public void oeffnen() {
		mDb.getReadableDatabase();
		LOG.v(TAG, "Datenbank kegelverwaltung geoeffnet.");
	}

	/**
	 * Oeffnet die Datenbank schreibbar, falls sie vorher mit schliessen()geschlossen wurde. 
	 * Bei Bedarf wird das Schema angelegt bzw. aktualisiert.
	 */
	public void oeffnenSchreibzugriff() {
		mDb.getWritableDatabase();
		LOG.v(TAG, "Datenbank kegelverwaltung schreibend geoeffnet.");
	}

	/**
	 * Gibt die Anzahl der Wettk�mpfe in der Datenbank zurueck.
	 * Performanter als Cursor::getCount.
	 * 
	 * @return Anzahl der Mannschaften.
	 */
	public int anzahlWettkaempfe() {
		final Cursor c = mDb.getReadableDatabase().rawQuery("select count(*) from " + WettkampfTbl.TABLE_NAME, null);
		if (c.moveToFirst() == false) {
			return 0;
		}
		return c.getInt(0);
	}

}
